React Native
https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/React-icon.svg/1024px-React-icon.svg.png
https://reactnative.dev/
Learn once, write anywhere: Build mobile apps with React.
Facebook が開発した React の開発様式を踏襲したクロスプラットフォームSDK、フレームワーク
WebViewをベースとした物ではないため高速に動作する
Web、Android、iOS 上で動作するアプリケーションを1コードから作成できる
他のクロスプラットフォームSDKと同じくエッジケースで環境個別の機能を呼び出すこともできる
開発言語には JavaScript 及び TypeScript が使用できる
Windows / macOS への対応
https://microsoft.github.io/react-native-windows/img/homepage/cross-platform.png
https://microsoft.github.io/react-native-windows/
Microsoft により React Native の拡張機能が提供されている
使用すると、Windows、macOS、XBox 上で動作するアプリケーションを出力できる。
https://github.com/microsoft/react-native-windows
https://github.com/microsoft/react-native-macos
サンプルコード
公式のサンプルコードより。Expoを使用して実際に動かして試せる。
https://reactnative.dev/docs/getting-started#interactive-examples
code:helloworld.js
import React from 'react';
import { Text, View } from 'react-native';
const YourApp = () => {
return (
<View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
<Text>
Try editing me! 🎉
</Text>
</View>
);
}
export default YourApp;
どのようにして動くのか
https://reactnative.dev/docs/assets/diagram_ios-android-views.svg
from: https://reactnative.dev/docs/intro-react-native-components
React Nativeは、Reactとアプリプラットフォームのネイティブ機能を使用してAndroidおよびiOSアプリケーションを構築するためのオープンソースフレームワークです。React Nativeでは、JavaScriptを使用してプラットフォームのAPIにアクセスし、Reactコンポーネント(再利用可能でネスト可能なコードのバンドル)を使用してUIの外観と動作を記述します。
React で使用されているAPIを介して各種OSのネイティブ機能を呼び出してアプリケーションを構築する
UI構築にしても React で書くことで独自のエンジンを用いて画面を作るのではなく、例えば Image を呼び出したとき、Androidでは ImageView を呼び出し、iOSでは UIImageView を呼ぶなどネイティブな機能を使ってくれるのでOSとの親和性が高い
したがってWebView上で動作しているReactを操作することでWebView外のアプリケーション機能を呼び出すといった構成のものとはもとから構造が違う。
一方でReactNativeが用意する範囲であれば、CSSのようなやり方でレイアウトやデザインを決定することもできる
Native Components
https://reactnative.dev/docs/native-components-android
https://reactnative.dev/docs/native-components-ios
各種OS固有の機能を使用するコードを書く仕組み、およびそれにより作成されたReact Native用のコンポーネント。
Android では Kotlin、Java のいずれか iOSでは Swift、Objective-C のいずれかが使用できる。
Native Modules
https://reactnative.dev/docs/native-modules-intro
各種OSの固有のAPIを実行できる仕組み。Apple や Google Play のAPIを実行する場合などに使用できる。
くわえて、既存のコードをモジュールとして読み込み、アプリケーションに組み込める。
採用事例
公式に採用事例がまとまっている。
https://reactnative.dev/showcase
/icons/facebook.icon Facebook (iOS/Android)
Dive into React Native performance
/icons/instagram.icon Instagram (iOS/Android)
React Native at Instagram
Oculus (iOS/Android)
/icons/skype.icon Skype (iOS/Android)
Web版「Skype」はMac/iPhoneもカバー ~Togetherモードのシーンも拡充した「Skype 8.71」
WiX (iOS/Android)
React Native at Wix — The Architecture
/icons/discord.icon Discord (iOS/Android)
Why Discord is Sticking with React Native
/icons/mercari.icon Mercari (iOS/Android)
Why we decided to rewrite our iOS & Android apps from scratch — in React Native
Pros/Cons
Pros
Facebook による開発がとにかく活発
JavaScript TypeScript がわかっていればすぐに開発を始められる
React の開発経験があればそれをベースにアプリケーションの作成が可能
ホットリロードのサポートがありトライアンドエラーが高速に行える
Facebook と Instagram、Oculusが使っているのでそうそうサポート終了ということにはならなそう
Cons
開発が活発なので追従が大変かもしれない
React っぽい開発の仕方を知っておく必要がある
パフォーマンスについて
60fpsのなめらかな挙動と、ネイティブなルックアンドフィールを実現するための手段が標準で備わっている。
(※ 高リフレッシュレートなディスプレイが増えてきている昨今60fpsが高速な部類に入るのかという話は別)
一方で、一部で最適化が必要になる場合に備えて公式で、パフォーマンスに関わるガイドラインが用意されている。
https://reactnative.dev/docs/performance
TypeScript の使い方
https://reactnative.dev/blog/2018/05/07/using-typescript-with-react-native
2018 年のブログに取り上げられている。
大枠としては、React Native TypeScriptTransformer をReact NativeのCLIに追加する。
code:rn-cli.config.js
module.exports = {
getTransformModulePath() {
return require.resolve('react-native-typescript-transformer');
},
getSourceExts() {
return 'ts', 'tsx';
}
};
型定義には@types/react と @types/react-native を依存に追加し、拡張子を ts もしくは tsx に変更する。
あとはテストの、設定や、細かな import の癖に関する解説まで行われているのでぜひ公式ブログを参照されたし。